package com.moon.leetcode;

// 1269. 停在原地的方案数
//
//有一个长度为 arrLen 的数组，开始有一个指针在索引 0 处。
//
// 每一步操作中，你可以将指针向左或向右移动 1 步，或者停在原地（指针不能被移动到数组范围外）。
//
// 给你两个整数 steps 和 arrLen ，请你计算并返回：在恰好执行 steps 次操作以后，指针仍然指向索引 0 处的方案数。
//
// 由于答案可能会很大，请返回方案数 模 10^9 + 7 后的结果。
//
// 示例 1：
//
// 输入：steps = 3, arrLen = 2
//输出：4
//解释：3 步后，总共有 4 种不同的方法可以停在索引 0 处。
//向右，向左，不动
//不动，向右，向左
//向右，不动，向左
//不动，不动，不动
//
// 示例 2：
//
// 输入：steps = 2, arrLen = 4
//输出：2
//解释：2 步后，总共有 2 种不同的方法可以停在索引 0 处。
//向右，向左
//不动，不动
//
// 示例 3：
//
// 输入：steps = 4, arrLen = 2
//输出：8
//
// 提示：
//
// 1 <= steps <= 500
// 1 <= arrLen <= 10^6
//
// Related Topics 动态规划
// 👍 96 👎 0
public class No1269_numWays {
    public static void main(String[] args) {
        System.out.println(new No1269_numWays().numWays(3, 2));
    }

    public int numWays(int steps, int arrLen) {
        int n = Math.min(steps, arrLen);
        long[][] f = new long[steps + 1][n + 2];
        f[0][1] = 1;
        for (int i = 1; i <= steps; i++) {
            for (int j = 1; j <= n; j++) {
                f[i][j] = (f[i - 1][j - 1] + f[i - 1][j] + f[i - 1][j + 1]) % 1000000007;
            }
        }
        return (int) f[steps][1];
    }
}
